home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 26 / Cream of the Crop 26.iso / program / ddj0897.zip / DYN401.ZIP / class / set.c < prev    next >
C/C++ Source or Header  |  1997-04-16  |  13KB  |  620 lines

  1.  
  2.  
  3. /*  Copyright (c) 1993-1996 Algorithms Corporation  */
  4. /*  All rights reserved.  */
  5.  
  6.  
  7.  
  8.  
  9. /*  This file automatically generated by dpp - do not edit  */
  10.  
  11. #define    DPP_STRATEGY    2
  12. #define    DPP_FASTWIDE    0
  13.  
  14.  
  15.  
  16. #line 16 "set.d"
  17. #include <string.h> 
  18. #include <math.h> 
  19.  
  20. #include "set1.h" 
  21.  
  22. #define    CLASS    Set_c
  23. #define    ivType    Set_iv_t
  24.  
  25. #include "generics.h"
  26.  
  27. object    Set_c;
  28.  
  29.  
  30. #line 31 "set.c"
  31. typedef struct  _Set_iv_t  {
  32.     int iSize;
  33.     int iNelm;
  34.     NODE * iTab;
  35.     CRITICALSECTION iCS;
  36. }    Set_iv_t;
  37.  
  38.  
  39. #line 40 "set.c"
  40. typedef struct  _Set_cv_t  {
  41.     NODE FNODES;
  42.     CRITICALSECTION cCS;
  43. }    Set_cv_t;
  44.  
  45. static    Set_cv_t    *Set_cv;
  46.  
  47.  
  48. #line 35 "set.d"
  49. static objrtn Lookup(object self, object luk, int mode, int deep, int type, object value); 
  50.  
  51. #define LTYPE 0 
  52.  
  53. #define NODE_BLOCK_SIZE 50 
  54.  
  55. static NODE new_node(void) 
  56.     int i; 
  57.     volatile NODE r; 
  58.  
  59.     ENTERCRITICALSECTION(Set_cv->cCS); 
  60.     if (!Set_cv->FNODES) { 
  61.         Set_cv->FNODES = Tncalloc(struct NODES, NODE_BLOCK_SIZE); 
  62.         for (i=0 ; i != (NODE_BLOCK_SIZE-1) ; ++i) 
  63.             Set_cv->FNODES[i].next = Set_cv->FNODES + (i + 1); 
  64.         gRegisterMemory(Dynace, Set_cv->FNODES, (long)(sizeof(struct NODES) * NODE_BLOCK_SIZE)); 
  65.     } 
  66.     r = Set_cv->FNODES; 
  67.     Set_cv->FNODES = Set_cv->FNODES->next; 
  68.     LEAVECRITICALSECTION(Set_cv->cCS); 
  69.     return r; 
  70.  
  71. static void free_node(NODE i) 
  72.     ENTERCRITICALSECTION(Set_cv->cCS); 
  73.     i->luk = NULL; 
  74.     i->next = Set_cv->FNODES; 
  75.     Set_cv->FNODES = i; 
  76.     LEAVECRITICALSECTION(Set_cv->cCS); 
  77.  
  78. cmeth objrtn New(object self, int size)
  79.     object set = oSuper(Set_c, gNew, self)(self); 
  80.     ivType *iv = ivPtr(set); 
  81.     iv->iSize = size; 
  82.     iv->iTab = Tncalloc(NODE, size); 
  83.     INITIALIZECRITICALSECTION(iv->iCS); 
  84.     return set; 
  85.  
  86. cmeth objrtn Set_cm_gNew(object self)
  87.     return New(self, 51); 
  88.  
  89. static objrtn _copy(object self, int deep)
  90. { Set_iv_t *iv = GetIVs(Set, self);
  91.     object nobj; 
  92.     ivType *iv2; 
  93.     int i; 
  94.  
  95.     ENTERCRITICALSECTION(iv->iCS); 
  96.     if (deep < 2) 
  97.         nobj = oSuper(Set_c, gCopy, self)(self); 
  98.     else 
  99.         nobj = oSuper(Set_c, gDeepCopy, self)(self); 
  100.     iv2 = ivPtr(nobj); 
  101.  
  102.     iv2->iSize = iv->iSize; 
  103.     iv2->iTab = Tncalloc(NODE, iv2->iSize); 
  104.     for (i=0 ; i != iv2->iSize ; ++i) { 
  105.         NODE n, n2, p; 
  106.  
  107.         for (n=iv->iTab[i], p=NULL ; n ; p=n2, n=n->next) { 
  108.             n2 = new_node(); 
  109.             switch (deep) { 
  110.                 case 0: 
  111.                 default: 
  112.                 n2->luk = n->luk; 
  113.                 break; 
  114.                 case 1: 
  115.                 n2->luk = gCopy(n->luk); 
  116.                 break; 
  117.                 case 2: 
  118.                 n2->luk = gDeepCopy(n->luk); 
  119.                 break; 
  120.             } 
  121.             n2->next = NULL; 
  122.             if (p) 
  123.                 p->next = n2; 
  124.             else 
  125.                 iv2->iTab[i] = n2; 
  126.         } 
  127.     } 
  128.     LEAVECRITICALSECTION(iv->iCS); 
  129.     return nobj; 
  130.  
  131. imeth objrtn Set_im_gCopy(object self)
  132.     return _copy(self, ClassOf(self) != CLASS); 
  133.  
  134. imeth objrtn Set_im_gDeepCopy(object self)
  135.     return _copy(self, 2); 
  136.  
  137.  
  138.  
  139.  
  140.  
  141. imeth int Set_im_gSize(object self)
  142. { Set_iv_t *iv = GetIVs(Set, self);
  143.     return iv->iNelm; 
  144.  
  145. static objrtn _delete(object self, int mode, int entire)
  146. { Set_iv_t *iv = GetIVs(Set, self);
  147.     int i; 
  148.  
  149.     ENTERCRITICALSECTION(iv->iCS); 
  150.     for (i=0 ; i != iv->iSize ; ++i) { 
  151.         NODE n, p = iv->iTab[i]; 
  152.  
  153.         for (; p ; p = n) { 
  154.             if (mode == 1) 
  155.                 gDispose(p->luk); 
  156.             else if (mode == 2) 
  157.                 gDeepDispose(p->luk); 
  158.             n = p->next; 
  159.             free_node(p); 
  160.         } 
  161.         iv->iTab[i] = NULL; 
  162.     } 
  163.     if (entire) { 
  164.         free(iv->iTab); 
  165.         LEAVECRITICALSECTION(iv->iCS); 
  166.         DELETECRITICALSECTION(iv->iCS); 
  167.         self = oSuper(Set_c, gDispose, self)(self); 
  168.     } else { 
  169.         iv->iNelm = 0; 
  170.         LEAVECRITICALSECTION(iv->iCS); 
  171.     } 
  172.     return self; 
  173.  
  174. imeth objrtn Set_im_gDispose(object self)
  175.     return _delete(self, 0, 1); 
  176.  
  177. imeth objrtn Set_im_gDeepDispose(object self)
  178.     return _delete(self, 2, 1); 
  179.  
  180. imeth objrtn Set_im_gDispose1(object self)
  181.     return _delete(self, 1, 1); 
  182.  
  183. imeth objrtn Set_im_gDisposeAllNodes(object self)
  184.     return _delete(self, 0, 0); 
  185.  
  186. imeth objrtn Set_im_gDeepDisposeAllNodes(object self)
  187.     return _delete(self, 2, 0); 
  188.  
  189. imeth objrtn Set_im_gDisposeAllNodes1(object self)
  190.     return _delete(self, 1, 0); 
  191.  
  192.  
  193.  
  194. imeth objrtn Set_im_gForAll(object self, object (*fun)())
  195. { Set_iv_t *iv = GetIVs(Set, self);
  196.     int i; 
  197.  
  198.     ENTERCRITICALSECTION(iv->iCS); 
  199.     for (i=0 ; i != iv->iSize ; ++i) { 
  200.         NODE p = iv->iTab[i]; 
  201.         object v; 
  202.  
  203.         for (; p ; p = p->next) 
  204.             if (v = (*(object (*)(object))fun)(p->luk)) { 
  205.             LEAVECRITICALSECTION(iv->iCS); 
  206.             return(v); 
  207.         } 
  208.     } 
  209.     LEAVECRITICALSECTION(iv->iCS); 
  210.     return NULL; 
  211.  
  212. imeth objrtn Set_im_gStringRep(object self)
  213. { Set_iv_t *iv = GetIVs(Set, self);
  214.     int i; 
  215.     object s, t; 
  216.  
  217.     s = oSuper(Set_c, gStringRepValue, self)(self); 
  218.     gAppend(s, (object) "  [\n"); 
  219.     for (i=0 ; i != iv->iSize && !iv->iTab[i] ; ++i); 
  220.     while (i != iv->iSize) { 
  221.         NODE p = iv->iTab[i]; 
  222.  
  223.         while (++i != iv->iSize && !iv->iTab[i]); 
  224.         while (p) { 
  225.             t = gStringRepValue(p->luk); 
  226.             if ((p = p->next) || i != iv->iSize) 
  227.                 vBuild(s, NULL, "\t", t, ",\n", NULL); 
  228.             else 
  229.                 vBuild(s, NULL, "\t", t, "\n", NULL); 
  230.             gDispose(t); 
  231.         } 
  232.     } 
  233.     gAppend(s, (object) "]\n"); 
  234.     return s; 
  235.  
  236.  
  237.  
  238.  
  239.  
  240. imeth objrtn Set_im_gAdd(object self, object luk)
  241.     ChkArg(luk, 2); 
  242.     return Lookup(self, luk, HT_ADD, 0, LTYPE, NULL); 
  243.  
  244.  
  245.  
  246. imeth objrtn Set_im_gFind(object self, object luk)
  247.     ChkArg(luk, 2); 
  248.     return Lookup(self, luk, HT_FIND, 0, LTYPE, NULL); 
  249.  
  250.  
  251.  
  252. imeth objrtn Set_im_gFindAdd(object self, object luk)
  253.     ChkArg(luk, 2); 
  254.     return Lookup(self, luk, HT_FINDADD, 0, LTYPE, NULL); 
  255.  
  256.  
  257.  
  258. imeth objrtn Set_im_gRemoveObj(object self, object luk)
  259.     ChkArg(luk, 2); 
  260.     return Lookup(self, luk, HT_DELETE, 0, LTYPE, NULL); 
  261.  
  262.  
  263.  
  264. imeth objrtn Set_im_gDisposeObj(object self, object luk)
  265.     ChkArg(luk, 2); 
  266.     return Lookup(self, luk, HT_DELETE, 1, LTYPE, NULL); 
  267.  
  268.  
  269.  
  270. imeth objrtn Set_im_gDeepDisposeObj(object self, object luk)
  271.     ChkArg(luk, 2); 
  272.     return Lookup(self, luk, HT_DELETE, 2, LTYPE, NULL); 
  273.  
  274.  
  275.  
  276. static objrtn _deleteGroup(object self, int (*fun)(), int deep)
  277. { Set_iv_t *iv = GetIVs(Set, self);
  278.     int i; 
  279.     NODE n, lastp, p; 
  280.  
  281.     ENTERCRITICALSECTION(iv->iCS); 
  282.     for (i=0 ; i != iv->iSize ; ++i) { 
  283.         for (lastp=NULL, p=iv->iTab[i] ; p ; ) 
  284.             if ((*(int (*)(object))fun)(p->luk)) { 
  285.             if (deep == 1) 
  286.                 gDispose(p->luk); 
  287.             else if (deep == 2) 
  288.                 gDeepDispose(p->luk); 
  289.             if (lastp) 
  290.                 lastp->next = n = p->next; 
  291.             else 
  292.                 iv->iTab[i] = n = p->next; 
  293.             free_node(p); 
  294.             p = n; 
  295.             --iv->iNelm; 
  296.         } else { 
  297.             lastp = p; 
  298.             p = p->next; 
  299.         } 
  300.     } 
  301.     LEAVECRITICALSECTION(iv->iCS); 
  302.     return self; 
  303.  
  304. imeth objrtn Set_im_gGroupRemove(object self, int (*fun)())
  305.     return _deleteGroup(self, fun, 0); 
  306.  
  307. imeth objrtn Set_im_gDisposeGroup(object self, int (*fun)())
  308.     return _deleteGroup(self, fun, 1); 
  309.  
  310. imeth objrtn Set_im_gDeepDisposeGroup(object self, int (*fun)())
  311.     return _deleteGroup(self, fun, 2); 
  312.  
  313.  
  314.  
  315.  
  316. imeth objrtn Set_im_gResize(object self, int size)
  317. { Set_iv_t *iv = GetIVs(Set, self);
  318.     NODE *v; 
  319.     int i, sz; 
  320.  
  321.     ENTERCRITICALSECTION(iv->iCS); 
  322.     v = iv->iTab; 
  323.     sz = iv->iSize; 
  324.     iv->iSize = size; 
  325.     iv->iTab = Tncalloc(NODE, size); 
  326.     iv->iNelm = 0; 
  327.     for (i=0 ; i != sz ; ++i) { 
  328.         NODE n, t; 
  329.  
  330.         for (n=v[i] ; n ; n = t) { 
  331.             Lookup(self, n->luk, HT_ADD, 0, LTYPE, NULL); 
  332.             t = n->next; 
  333.             free_node(n); 
  334.         } 
  335.     } 
  336.     free(v); 
  337.     LEAVECRITICALSECTION(iv->iCS); 
  338.     return self; 
  339.  
  340. static unsigned hash_string(char *s) 
  341.     register char c = 'a'; 
  342.     double t; 
  343.     register unsigned short k=0; 
  344.  
  345.     while (*s) 
  346.         k += *s++ ^ c++; 
  347.     t = .6125423371 * k; 
  348.     t = t < 0.0 ? -t : t; 
  349.     return (int) (BIG_INT * (t - floor(t))); 
  350.  
  351. static unsigned hash_short(int val) 
  352.     double t; 
  353.  
  354.     t = .6125423371 * (unsigned) val; 
  355.     t = t < 0.0 ? -t : t; 
  356.     return (unsigned) (BIG_INT * (t - floor(t))); 
  357.  
  358. imeth objrtn Lookup(object self, object luk, int mode, int deep, int type, object value)
  359.  
  360.  
  361.  
  362. { Set_iv_t *iv = GetIVs(Set, self);
  363.     NODE e, laste=NULL, newe; 
  364.     unsigned idx; 
  365.     int i=0; 
  366.     struct _Object_iv_t * volatile ret; 
  367.  
  368.     ENTERCRITICALSECTION(iv->iCS); 
  369.     if (type == 2) 
  370.         idx = hash_string((char *) luk) % iv->iSize; 
  371.     else if (type == 3 || type == 4) 
  372.         idx = hash_short(*((int *) luk)) % iv->iSize; 
  373.     else 
  374.         idx = gHash(luk) % iv->iSize; 
  375.     if (idx >= (unsigned) iv->iSize) 
  376.         idx %= iv->iSize; 
  377.     e = iv->iTab[idx]; 
  378.     while (1) { 
  379.         if (e == NULL) { 
  380.             if (mode != HT_ADD && mode != HT_FINDADD) { 
  381.                 LEAVECRITICALSECTION(iv->iCS); 
  382.                 return(NULL); 
  383.             } 
  384.             e = new_node(); 
  385.             switch (type) { 
  386.                 case 0: 
  387.                 default: 
  388.                 e->luk = luk; 
  389.                 break; 
  390.                 case 1: 
  391.                 e->luk = gNewWithObjObj(ObjectAssociation, luk, value); 
  392.                 break; 
  393.                 case 2: 
  394.                 e->luk = gNewWithStrObj(StringAssociation, (char *) luk, value); 
  395.                 break; 
  396.  
  397.  
  398.  
  399.                 case 4: 
  400.                 e->luk = gNewWithIntObj(IntegerAssociation, *((int *)luk), value); 
  401.                 break; 
  402.             } 
  403.             e->next = NULL; 
  404.             if (laste) 
  405.                 laste->next = e; 
  406.             else 
  407.                 iv->iTab[idx] = e; 
  408.             ++iv->iNelm; 
  409.             break; 
  410.         } 
  411.         switch (type) { 
  412.             case 0: 
  413.             i = e->luk == luk ? 0 : gCompare(e->luk, luk); 
  414.             break; 
  415.             case 1: { 
  416.                 object t = gKey(e->luk); 
  417.                 i = t == luk ? 0 : gCompare(t, luk); 
  418.                 break; 
  419.             } 
  420.             case 2: { 
  421.                 char *t = gStringKey(e->luk); 
  422.                 i = t == (char *) luk ? 0 : strcmp(t, (char *) luk); 
  423.                 break; 
  424.             } 
  425.  
  426.  
  427.  
  428.             case 4: 
  429.             i = gIntKey(e->luk) - *((int *) luk); 
  430.             break; 
  431.         } 
  432.         if (!i) { 
  433.             if (mode == HT_ADD) { 
  434.                 LEAVECRITICALSECTION(iv->iCS); 
  435.                 return(NULL); 
  436.             } 
  437.             if (mode == HT_DELETE) { 
  438.                 if (deep == 1) 
  439.                     gDispose(e->luk); 
  440.                 else if (deep == 2) 
  441.                     gDeepDispose(e->luk); 
  442.                 if (laste) 
  443.                     laste->next = e->next; 
  444.                 else 
  445.                     iv->iTab[idx] = e->next; 
  446.                 ret = e->luk; 
  447.                 free_node(e); 
  448.                 --iv->iNelm; 
  449.                 LEAVECRITICALSECTION(iv->iCS); 
  450.                 return deep ? self : (object) ret; 
  451.             } 
  452.             break; 
  453.         } else if (i > 0) { 
  454.             if (mode != HT_ADD && mode != HT_FINDADD) { 
  455.                 LEAVECRITICALSECTION(iv->iCS); 
  456.                 return(NULL); 
  457.             } 
  458.             newe = new_node(); 
  459.             switch (type) { 
  460.                 case 0: 
  461.                 default: 
  462.                 newe->luk = luk; 
  463.                 break; 
  464.                 case 1: 
  465.                 newe->luk = gNewWithObjObj(ObjectAssociation, luk, value); 
  466.                 break; 
  467.                 case 2: 
  468.                 newe->luk = gNewWithStrObj(StringAssociation, (char *) luk, value); 
  469.                 break; 
  470.  
  471.  
  472.  
  473.                 case 4: 
  474.                 newe->luk = gNewWithIntObj(IntegerAssociation, *((int *) luk), value); 
  475.                 break; 
  476.             } 
  477.             newe->next = e; 
  478.             if (laste) 
  479.                 laste->next = newe; 
  480.             else 
  481.                 iv->iTab[idx] = newe; 
  482.             e = newe; 
  483.             ++iv->iNelm; 
  484.             break; 
  485.         } else { 
  486.             laste = e; 
  487.             e = e->next; 
  488.         } 
  489.     } 
  490.     ret = e->luk; 
  491.     LEAVECRITICALSECTION(iv->iCS); 
  492.     return (object) ret; 
  493.  
  494. imeth objrtn Set_im_gSequence(object self)
  495. { Set_iv_t *iv = GetIVs(Set, self);
  496.     return gNewSetSeq(SetSequence, iv->iSize, iv->iNelm, (void *) iv->iTab); 
  497.  
  498. static void class_init(void) 
  499.     INITIALIZECRITICALSECTION(Set_cv->cCS); 
  500.  
  501. #line 559 "set.c"
  502.  
  503. objrtn    Set_initialize(void)
  504. {
  505.     static  CRITICALSECTION  cs;
  506.     static  int volatile once = 0;
  507.  
  508.     ENTERCRITICALSECTION(_CI_CS_);
  509.     if (!once) {
  510.         INITIALIZECRITICALSECTION(cs);
  511.         once = 1;
  512.     }
  513.     LEAVECRITICALSECTION(_CI_CS_);
  514.  
  515.     ENTERCRITICALSECTION(cs);
  516.  
  517.     if (Set_c) {
  518.         LEAVECRITICALSECTION(cs);
  519.         return Set_c;
  520.     }
  521.     INHIBIT_THREADER;
  522.     Set_c = gNewClass(Class, "Set", sizeof(Set_iv_t), sizeof(Set_cv_t), END);
  523.     cMethodFor(Set, gNewWithInt, New);
  524.     cMethodFor(Set, gNew, Set_cm_gNew);
  525.     iMethodFor(Set, gDeepDisposeObj, Set_im_gDeepDisposeObj);
  526.     iMethodFor(Set, gFindAdd, Set_im_gFindAdd);
  527.     iMethodFor(Set, gDispose1, Set_im_gDispose1);
  528.     iMethodFor(Set, gDeepDisposeGroup, Set_im_gDeepDisposeGroup);
  529.     iMethodFor(Set, gFind, Set_im_gFind);
  530.     iMethodFor(Set, gDisposeObj, Set_im_gDisposeObj);
  531.     iMethodFor(Set, gDisposeAllNodes, Set_im_gDisposeAllNodes);
  532.     iMethodFor(Set, gSize, Set_im_gSize);
  533.     iMethodFor(Set, gDeepDisposeAllNodes, Set_im_gDeepDisposeAllNodes);
  534.     iMethodFor(Set, gRemoveObj, Set_im_gRemoveObj);
  535.     iMethodFor(Set, gDispose, Set_im_gDispose);
  536.     iMethodFor(Set, gForAll, Set_im_gForAll);
  537.     iMethodFor(Set, gSequence, Set_im_gSequence);
  538.     iMethodFor(Set, gDisposeAllNodes1, Set_im_gDisposeAllNodes1);
  539.     iMethodFor(Set, gAdd, Set_im_gAdd);
  540.     iMethodFor(Set, gGCDispose, Set_im_gDispose);
  541.     iMethodFor(Set, gCopy, Set_im_gCopy);
  542.     iMethodFor(Set, gDeepDispose, Set_im_gDeepDispose);
  543.     iMethodFor(Set, gResize, Set_im_gResize);
  544.     iMethodFor(Set, gStringRep, Set_im_gStringRep);
  545.     iMethodFor(Set, gLookup, Lookup);
  546.     iMethodFor(Set, gGroupRemove, Set_im_gGroupRemove);
  547.     iMethodFor(Set, gDeepCopy, Set_im_gDeepCopy);
  548.     iMethodFor(Set, gDisposeGroup, Set_im_gDisposeGroup);
  549.  
  550.     Set_cv = GetCVs(Set);
  551.  
  552.     class_init();
  553.  
  554.     ENABLE_THREADER;
  555.  
  556.     LEAVECRITICALSECTION(cs);
  557.  
  558.     return Set_c;
  559. }
  560.  
  561.  
  562.  
  563.